/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 *    SetupModePanel.java
 *    Copyright (C) 2002 University of Waikato, Hamilton, New Zealand
 *
 */

package weka.gui.experiment;

import weka.experiment.Experiment;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;

import javax.swing.ButtonGroup;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

/**
 * This panel switches between simple and advanced experiment setup panels.
 * 
 * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
 * @version $Revision: 7059 $
 */
public class SetupModePanel extends JPanel {

	/** for serialization */
	private static final long serialVersionUID = -3758035565520727822L;

	/** The button for choosing simple setup mode */
	protected JRadioButton m_SimpleSetupRBut = new JRadioButton(Messages
			.getInstance().getString(
					"SetupModePanel_SimpleSetupRBut_JRadioButton_Text"));

	/** The button for choosing advanced setup mode */
	protected JRadioButton m_AdvancedSetupRBut = new JRadioButton(Messages
			.getInstance().getString(
					"SetupModePanel_AdvancedSetupRBut_JRadioButton_Text"));

	/** The simple setup panel */
	protected SimpleSetupPanel m_simplePanel = new SimpleSetupPanel();

	/** The advanced setup panel */
	protected SetupPanel m_advancedPanel = new SetupPanel();

	/**
	 * Creates the setup panel with no initial experiment.
	 */
	public SetupModePanel() {

		m_simplePanel.setModePanel(this);

		m_SimpleSetupRBut.setMnemonic('S');
		m_SimpleSetupRBut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				switchToSimple(null);
			}
		});

		m_AdvancedSetupRBut.setMnemonic('A');
		m_AdvancedSetupRBut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				switchToAdvanced(null);
			}
		});

		ButtonGroup modeBG = new ButtonGroup();
		modeBG.add(m_SimpleSetupRBut);
		modeBG.add(m_AdvancedSetupRBut);
		m_SimpleSetupRBut.setSelected(true);

		JPanel modeButtons = new JPanel();
		modeButtons.setLayout(new GridLayout(1, 0));
		modeButtons.add(m_SimpleSetupRBut);
		modeButtons.add(m_AdvancedSetupRBut);

		JPanel switchPanel = new JPanel();
		switchPanel.setLayout(new GridLayout(1, 0));
		switchPanel.add(new JLabel(Messages.getInstance().getString(
				"SetupModePanel_SwitchPanel_JPanel_Text")));
		switchPanel.add(modeButtons);

		setLayout(new BorderLayout());
		add(switchPanel, BorderLayout.NORTH);
		add(m_simplePanel, BorderLayout.CENTER);
	}

	/**
	 * Switches to the advanced setup mode.
	 * 
	 * @param exp
	 *            the experiment to configure
	 */
	public void switchToAdvanced(Experiment exp) {

		if (exp == null) {
			exp = m_simplePanel.getExperiment();
		}
		if (exp != null) {
			m_AdvancedSetupRBut.setSelected(true);
			m_advancedPanel.setExperiment(exp);
		}
		remove(m_simplePanel);
		m_simplePanel.removeNotesFrame();
		add(m_advancedPanel, BorderLayout.CENTER);
		validate();
		repaint();
	}

	/**
	 * Switches to the simple setup mode only if allowed to.
	 * 
	 * @param exp
	 *            the experiment to configure
	 */
	public void switchToSimple(Experiment exp) {

		if (exp == null) {
			exp = m_advancedPanel.getExperiment();
		}
		if (exp != null && !m_simplePanel.setExperiment(exp)) {
			m_AdvancedSetupRBut.setSelected(true);
			switchToAdvanced(exp);
		} else {
			remove(m_advancedPanel);
			m_advancedPanel.removeNotesFrame();
			add(m_simplePanel, BorderLayout.CENTER);
			validate();
			repaint();
		}
	}

	/**
	 * Adds a PropertyChangeListener who will be notified of value changes.
	 * 
	 * @param l
	 *            a value of type 'PropertyChangeListener'
	 */
	public void addPropertyChangeListener(PropertyChangeListener l) {

		m_simplePanel.addPropertyChangeListener(l);
		m_advancedPanel.addPropertyChangeListener(l);
	}

	/**
	 * Gets the currently configured experiment.
	 * 
	 * @return the currently configured experiment.
	 */
	public Experiment getExperiment() {

		if (m_SimpleSetupRBut.isSelected())
			return m_simplePanel.getExperiment();
		else
			return m_advancedPanel.getExperiment();
	}
}
